package org.lanyu.springainovel.common.config;

import lombok.extern.slf4j.Slf4j;
import org.lanyu.springainovel.common.entity.User;
import org.lanyu.springainovel.common.mapper.UserMapper;
import org.lanyu.springainovel.common.service.UserCacheService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.stereotype.Component;

import java.util.Date;
import java.util.List;

/**
 * 系统初始化器
 * 在应用启动后执行一些初始化操作
 */
@Slf4j
@Component
public class SystemInitializer implements ApplicationRunner {

    @Autowired
    private UserMapper userMapper;
    
    @Autowired
    private CustomPasswordEncoder passwordEncoder;
    
    @Autowired
    private UserCacheService userCacheService;

    @Override
    public void run(ApplicationArguments args) throws Exception {
        log.info("开始执行系统初始化...");
        
        // 检查是否存在admin用户，不存在则创建
        initDefaultAdmin();
        
        log.info("系统初始化完成");
    }
    
    /**
     * 初始化默认管理员用户
     */
    private void initDefaultAdmin() {
        // 检查admin用户是否存在
        User adminUser = userMapper.selectOne(
            new com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper<User>()
                .eq(User::getUsername, "admin")
        );
        
        if (adminUser == null) {
            System.out.println("admin用户不存在，开始创建...");
            // 创建admin用户
            adminUser = new User();
            adminUser.setUsername("admin");
            // 使用用户名作为盐值加密密码，确保同一用户名的同一密码生成固定加密密码
            String encodedPassword = passwordEncoder.encodeWithUsernameSalt("admin123", "admin");
            
            adminUser.setPassword(encodedPassword);
            adminUser.setNickname("系统管理员");
            adminUser.setRole("ROLE_ADMIN");
            adminUser.setEnabled(true);
            adminUser.setCreateTime(new Date());
            adminUser.setUpdateTime(new Date());
            
            userMapper.insert(adminUser);
            log.info("创建默认管理员用户: admin");
            System.out.println("admin用户创建成功，ID: " + adminUser.getId());
        } else {
            System.out.println("admin用户已存在，ID: " + adminUser.getId());
            System.out.println("当前密码: " + adminUser.getPassword());
        }
    }
    
    /**
     * 批量重置所有用户密码为admin123
     * 使用用户名作为盐值，确保同一用户名的同一密码生成固定加密密码
     */
    private void resetAllUserPasswords() {
        try {
            // 获取所有用户
            List<User> users = userMapper.selectList(null);
            if (users.isEmpty()) {
                log.info("系统中没有用户，无需重置密码");
                return;
            }
            
            Date updateTime = new Date();
            int updateCount = 0;
            
            // 逐个更新用户密码，使用用户名作为盐值
            for (User user : users) {
                String encodedPassword = passwordEncoder.encodeWithUsernameSalt("admin123", user.getUsername());

                user.setPassword(encodedPassword);
                user.setUpdateTime(updateTime);
                userMapper.updateById(user);
                updateCount++;
            }
            
            log.info("成功批量重置{}个用户的密码为admin123", updateCount);
            
            // 清除所有用户缓存，确保缓存中的密码信息也被更新
            userCacheService.clearAll();
            log.info("已清除所有用户缓存，确保密码重置生效");
            
        } catch (Exception e) {
            log.error("批量重置用户密码时发生错误", e);
        }
    }
}
